/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package busquedaAmplitud;

/**
 *
 * Clase que modela el tablero para el caso del algoritmo primero en amplitud
 * Fue necesaria dado que utiliza mas atributos que en el caso del algoritmo
 * primero en profundidad
 */
public class NodoA {

    public int idPadre; //identifica quien es su padre
    public int nivel; //determina el nivel del arbol de busqueda en el que estamos
    public int id; //id al nodo correspondiente
    public int[][] Posicion; //es la matriz que representa al estado de ocupacion del tablero
    public int[][] Peso; // se toma como base para calcular el costo
    public int costo; //costo del movimiento correspondiente

   
    public NodoA (int [][] matrizInicial, int idPadre, int nivel, int id){
        // Aca cargamos los valores de la matriz de posiciones actual
        this.idPadre = idPadre;
        this.nivel = nivel;
        this.id = id;
        Posicion = new int [8][8];
        Peso = new int[8][8];
        for (int i=0; i<8; i++){
            for (int j=0; j<8; j++){
                Posicion[i][j] = matrizInicial [i][j];

            }
        }
        // ahora cargamos la matriz de peso actual
         for (int i=0; i<8; i++){
            for (int j=0; j<8; j++){
               if (Posicion [i][j] == 0){
                   Peso [i][j] = 20;

               }else {
                   if (Posicion [i][j]==1) {
                       // el valor 10 nos indica que hay un caballo blanco
                       Peso [i][j] =10;

                   }else {
                       // el valor 20 nos indica que no hay caballos
                       Peso [i][j]=20;
                   }

               }

            }
        }




    }

    //Metodos para hacer modificaciones a las matrices del nodo
    public void modificarPosicion (int i, int j, int valor){
        // Este metodo modifica el valor de la posicion en la que se encuentra.
        getPosicion()[i][j] = valor;


    }
    public void modificarPeso (int i, int j, int peso){
        // Este metodo modifica el valor del peso en la posicion en la que se encuentra.
        getPeso()[i][j] = peso;
    }
    //Metodo para actualizar costos
    public void calcularCostoNuevo (int costoViejo, int peso){
        // Aca sumamos los costos de las posiciones que nos vamos moviendo.
        int nuevoCosto;
        nuevoCosto = costoViejo + peso;
        this.costo = nuevoCosto;
    }
    //Metodo para determinar el valor de la fila donde esta ubicado el caballo negro
    public int filaCN(){
        int fila = 0;
        for(int i=0;i<8;i++){
            for(int j=0;j<8;j++){

                if(this.getPosicion()[i][j]==2){
                    fila = i;
                }

            }
        }
        return fila;
    }
    //metodo que devuelve la columna del caballo negro
    public int colCN(){
        int col = 0;
        for(int i=0;i<8;i++){
            for(int j=0;j<8;j++){

                if(this.getPosicion()[i][j]==2){
                    col = j;
                }
            }
        }
        return col;
    }

    //Getters y Setters
    public int[][] getPosicion() {
        return Posicion;
    }

    /**
     * @param Posicion the Posicion to set
     */
    public void setPosicion(int[][] Posicion) {
        this.Posicion = Posicion;
    }

    /**
     * @return the Peso
     */
    public int[][] getPeso() {
        return Peso;
    }

    /**
     * @param Peso the Peso to set
     */
    public void setPeso(int[][] Peso) {
        this.Peso = Peso;
    }

    /**
     * @return the costo
     */
    public int getCosto() {
        return costo;
    }

    /**
     * @param costo the costo to set
     */
    public void setCosto(int costo) {
        this.costo = costo;
    }
    //Metodo para mostrar los valores de las matrices del nodo en consola
    public void mostrarValores(){
        System.out.println("Mostrar matriz de posiciones");
        for(int i=0;i<8;i++){
            for(int j=0;j<8;j++){
                System.out.print(this.Posicion[i][j]);
            }
            System.out.println();
        }
        System.out.println("id " + this.getId());
        System.out.println("id del Nodo Padre " + this.getIdPadre());
        System.out.println("nivel " + this.getNivel());
        System.out.println("costo " + this.getCosto());
    }

    /**
     * @return the nivel
     */
    public int getNivel() {
        return nivel;
    }

    /**
     * @param nivel the nivel to set
     */
    public void setNivel(int nivel) {
        this.nivel = nivel;
    }

    /**
     * @return the idPadre
     */
    public int getIdPadre() {
        return idPadre;
    }

    /**
     * @param idPadre the idPadre to set
     */
    public void setIdPadre(int idPadre) {
        this.idPadre = idPadre;
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }
}
